home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / asm-m68k / irq.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  3.5 KB  |  126 lines

  1. #ifndef _M68K_IRQ_H_
  2. #define _M68K_IRQ_H_
  3.  
  4. #include <linux/linkage.h>
  5. #include <linux/hardirq.h>
  6. #include <linux/spinlock_types.h>
  7.  
  8. /*
  9.  * This should be the same as the max(NUM_X_SOURCES) for all the
  10.  * different m68k hosts compiled into the kernel.
  11.  * Currently the Atari has 72 and the Amiga 24, but if both are
  12.  * supported in the kernel it is better to make room for 72.
  13.  */
  14. #if defined(CONFIG_VME) || defined(CONFIG_SUN3) || defined(CONFIG_SUN3X)
  15. #define NR_IRQS 200
  16. #elif defined(CONFIG_ATARI) || defined(CONFIG_MAC)
  17. #define NR_IRQS 72
  18. #elif defined(CONFIG_Q40)
  19. #define NR_IRQS    43
  20. #elif defined(CONFIG_AMIGA)
  21. #define NR_IRQS    32
  22. #elif defined(CONFIG_APOLLO)
  23. #define NR_IRQS    24
  24. #elif defined(CONFIG_HP300)
  25. #define NR_IRQS    8
  26. #else
  27. #define NR_IRQS    0
  28. #endif
  29.  
  30. /*
  31.  * The hardirq mask has to be large enough to have
  32.  * space for potentially all IRQ sources in the system
  33.  * nesting on a single CPU:
  34.  */
  35. #if (1 << HARDIRQ_BITS) < NR_IRQS
  36. # error HARDIRQ_BITS is too low!
  37. #endif
  38.  
  39. /*
  40.  * Interrupt source definitions
  41.  * General interrupt sources are the level 1-7.
  42.  * Adding an interrupt service routine for one of these sources
  43.  * results in the addition of that routine to a chain of routines.
  44.  * Each one is called in succession.  Each individual interrupt
  45.  * service routine should determine if the device associated with
  46.  * that routine requires service.
  47.  */
  48.  
  49. #define IRQ_SPURIOUS    0
  50.  
  51. #define IRQ_AUTO_1    1    /* level 1 interrupt */
  52. #define IRQ_AUTO_2    2    /* level 2 interrupt */
  53. #define IRQ_AUTO_3    3    /* level 3 interrupt */
  54. #define IRQ_AUTO_4    4    /* level 4 interrupt */
  55. #define IRQ_AUTO_5    5    /* level 5 interrupt */
  56. #define IRQ_AUTO_6    6    /* level 6 interrupt */
  57. #define IRQ_AUTO_7    7    /* level 7 interrupt (non-maskable) */
  58.  
  59. #define IRQ_USER    8
  60.  
  61. extern unsigned int irq_canonicalize(unsigned int irq);
  62.  
  63. struct pt_regs;
  64.  
  65. /*
  66.  * various flags for request_irq() - the Amiga now uses the standard
  67.  * mechanism like all other architectures - IRQF_DISABLED and
  68.  * IRQF_SHARED are your friends.
  69.  */
  70. #ifndef MACH_AMIGA_ONLY
  71. #define IRQ_FLG_LOCK    (0x0001)    /* handler is not replaceable    */
  72. #define IRQ_FLG_REPLACE    (0x0002)    /* replace existing handler    */
  73. #define IRQ_FLG_FAST    (0x0004)
  74. #define IRQ_FLG_SLOW    (0x0008)
  75. #define IRQ_FLG_STD    (0x8000)    /* internally used        */
  76. #endif
  77.  
  78. /*
  79.  * This structure is used to chain together the ISRs for a particular
  80.  * interrupt source (if it supports chaining).
  81.  */
  82. typedef struct irq_node {
  83.     int        (*handler)(int, void *);
  84.     void        *dev_id;
  85.     struct irq_node *next;
  86.     unsigned long    flags;
  87.     const char    *devname;
  88. } irq_node_t;
  89.  
  90. /*
  91.  * This structure has only 4 elements for speed reasons
  92.  */
  93. struct irq_handler {
  94.     int        (*handler)(int, void *);
  95.     unsigned long    flags;
  96.     void        *dev_id;
  97.     const char    *devname;
  98. };
  99.  
  100. struct irq_controller {
  101.     const char *name;
  102.     spinlock_t lock;
  103.     int (*startup)(unsigned int irq);
  104.     void (*shutdown)(unsigned int irq);
  105.     void (*enable)(unsigned int irq);
  106.     void (*disable)(unsigned int irq);
  107. };
  108.  
  109. extern int m68k_irq_startup(unsigned int);
  110. extern void m68k_irq_shutdown(unsigned int);
  111.  
  112. /*
  113.  * This function returns a new irq_node_t
  114.  */
  115. extern irq_node_t *new_irq_node(void);
  116.  
  117. extern void m68k_setup_auto_interrupt(void (*handler)(unsigned int, struct pt_regs *));
  118. extern void m68k_setup_user_interrupt(unsigned int vec, unsigned int cnt,
  119.                       void (*handler)(unsigned int, struct pt_regs *));
  120. extern void m68k_setup_irq_controller(struct irq_controller *, unsigned int, unsigned int);
  121.  
  122. asmlinkage void m68k_handle_int(unsigned int);
  123. asmlinkage void __m68k_handle_int(unsigned int, struct pt_regs *);
  124.  
  125. #endif /* _M68K_IRQ_H_ */
  126.